package com.ruyuan.rapid.core.netty.processor.filter;

import com.ruyuan.rapid.core.context.Context;

import java.util.List;

/**
 * 过滤器工厂接口
 * @author mac
 */
public interface ProcessorFilterFactory {

    /**
     * 根据过滤器类型添加一堆过滤器, 用于构建过滤器链条
     * @param filterType
     * @param filters
     * @throws Exception
     */
    void buildFilterChain(ProcessorFilterType filterType, List<ProcessorFilter<Context>> filters) throws Exception;

    /**
     * 正常情况下执行过滤器链
     * @param ctx
     * @throws Exception
     */
    void doFilterChain(Context ctx) throws Exception;

    /**
     * 异常情况下执行该过滤器链
     * @param ctx
     * @throws Exception
     */
    void doErrorFilterChain(Context ctx) throws Exception;

    /**
     * 获取一个过滤器
     * @param t
     * @param <T>
     * @return
     */
    <T> T getFilter(Class<T> t);

    /**
     * 获取指定id的过滤器
     * @param filterId
     * @param <T>
     * @return
     */
    <T> T getFilter(String filterId);
}
